package cn.always.xiajia.framework.mybatis.core.service;

import java.util.List;
import java.util.Map;
import java.util.function.Function;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.yulichang.base.MPJBaseService;

@SuppressWarnings({ "unused" })
public interface BaseServiceX<T> extends MPJBaseService<T> {

	/**
	 * 删除
	 * 
	 * @param param
	 * @return
	 */
	boolean xjRemove(Map<String, Object> param);

	/**
	 * 根据 Map，查询一条记录 <br/>
	 * <p>
	 * 结果集，如果是多个会抛出异常，随机取一条加上限制条件 wrapper.last("LIMIT 1")
	 * </p>
	 *
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 */
	T xjGetOne(Map<String, Object> param);

	/**
	 * 根据 Map，查询一条记录
	 *
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 * @param throwEx 有多个 result 是否抛出异常
	 */
	T xjGetOne(Map<String, Object> param, boolean throwEx);

	/**
	 * 根据 Map，查询一条记录
	 *
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 */
	Map<String, Object> xjGetMap(Map<String, Object> param);

	/**
	 * 根据 Map，查询一条记录
	 *
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 * @param mapper 转换函数
	 */
	<V> V xjGetObj(Map<String, Object> param, Function<? super Object, V> mapper);

	/**
	 * 查询指定条件是否存在数据
	 *
	 * @see Wrappers#emptyWrapper()
	 */
	boolean xjExists(Map<String, Object> param);

	/**
	 * 根据 Map 条件，查询总记录数
	 *
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 */
	long xjCount(Map<String, Object> param);

	/**
	 * 查询全部
	 * 
	 * @param param
	 * @return
	 */
	List<T> xjList(Map<String, Object> param);

	/**
	 * 查询列表
	 *
	 * @param page 分页条件
	 * @param queryWrapper queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 * @return 列表数据
	 * @since 3.5.3.2
	 */
	List<T> xjList(IPage<T> page, Map<String, Object> param);

	/**
	 * 翻页查询
	 *
	 * @param page 翻页对象
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 */
	<E extends IPage<T>> E xjPage(E page, Map<String, Object> param);

	/**
	 * 查询列表
	 *
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 */
	List<Map<String, Object>> xjListMaps(Map<String, Object> param);

	/**
	 * 查询列表
	 *
	 * @param page 分页条件
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 * @return 列表数据
	 * @since 3.5.3.2
	 */
	List<Map<String, Object>> xjListMaps(IPage<? extends Map<String, Object>> page, Map<String, Object> param);

	/**
	 * 根据 Map 条件，查询全部记录
	 *
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 */
	List<Object> xjListObjs(Map<String, Object> param);

	/**
	 * 根据 Map 条件，查询全部记录
	 *
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 * @param mapper 转换函数
	 */
	<V> List<V> xjListObjs(Map<String, Object> param, Function<? super Object, V> mapper);

	/**
	 * 翻页查询
	 *
	 * @param page 翻页对象
	 * @param queryWrapper 实体对象封装操作类
	 *            {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
	 */
	<E extends IPage<Map<String, Object>>> E xjPageMaps(E page, Map<String, Object> param);

}
